package mac5855.app.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


import mac5855.app.models.Usuario;

public class JdbcUsuarioDAO implements UsuarioDAO {

	@Override
	public void create(Usuario newInstance) {
		Connection conn = null;
		conn = JdbcDAOFactory.createConnection();
		String sql = "insert into usuarios (nome, email, senha, tipo, ultimo_login) "			
			+"values (?, ?, md5(?), ?, ?)";
		System.out.println(sql);
		PreparedStatement stm;
		try {
			stm = conn.prepareStatement(sql);
			stm.setString(1, newInstance.getNome());
			stm.setString(2, newInstance.getEmail());
			stm.setString(3, newInstance.getSenha());
			stm.setString(4, newInstance.getTipo());
			stm.setTimestamp(5, new java.sql.Timestamp((new Date()).getTime()));
			stm.execute();

			stm.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Gravado!");
		JdbcDAOFactory.releaseConnection(conn);

	}

	@Override
	public void delete(String id) {
		Connection conn = null;
		conn = JdbcDAOFactory.createConnection();
		String sql = "delete from usuarios where email = ?";
		
		PreparedStatement stm;
		try {
			stm = conn.prepareStatement(sql);
			stm.setString(1, id);
			stm.execute();

			stm.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		JdbcDAOFactory.releaseConnection(conn);

	}

	@Override
	public Usuario find(Usuario object) {

		Connection conn = JdbcDAOFactory.createConnection();
		Usuario usuario = null;
		try {
			PreparedStatement stmt = conn.prepareStatement("select * from usuarios where email = ? and senha = md5(?)");
			stmt.setString(1, object.getEmail());
			stmt.setString(2, object.getSenha());
			ResultSet rs = stmt.executeQuery();
			if (rs.next()) { //Query only returns 1 record in the result set; only 1 
				usuario = new Usuario();
				usuario.setSenha(rs.getString("senha"));
				usuario.setEmail(rs.getString("email"));
				usuario.setNome(rs.getString("nome"));
				usuario.setTipo(rs.getString("tipo"));
				usuario.setUltimoLogin(rs.getDate("ultimo_login"));
				
			}
			rs.close();
			stmt.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		JdbcDAOFactory.releaseConnection(conn);

		return usuario;

	}

	@Override
	public Usuario[] findAll() {
		Connection conn = JdbcDAOFactory.createConnection();
		List<Usuario> usuarios = new ArrayList<Usuario>();
		try {
			PreparedStatement stmt = conn.prepareStatement("select * from usuarios");
			ResultSet rs = stmt.executeQuery();


			while (rs.next()) {
				// criando o objeto Contato
				Usuario usuario = new Usuario();
				usuario.setNome(rs.getString("nome"));
				usuario.setEmail(rs.getString("email"));
				usuario.setTipo(rs.getString("tipo"));
				usuario.setUltimoLogin(rs.getDate("ultimo_login"));

				// adicionando o objeto à lista
				usuarios.add(usuario);
			}

			rs.close();
			stmt.close();
		}
		catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		JdbcDAOFactory.releaseConnection(conn);

		return usuarios.toArray(new Usuario[usuarios.size()]);

	}

	@Override
	public void update(Usuario transientObject) {
		// TODO Auto-generated method stub

	}

	@Override
	public void updateLastLogon(Usuario usuario) {
		// TODO Auto-generated method stub
		
		Connection conn = JdbcDAOFactory.createConnection();

		try {
			PreparedStatement stmt = conn.prepareStatement("update usuarios set ultimo_login = ? where email = ?");
			stmt.setTimestamp(1, new Timestamp(usuario.getUltimoLogin().getTime()));
			stmt.setString(2, usuario.getEmail());
			stmt.executeUpdate();
			stmt.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		JdbcDAOFactory.releaseConnection(conn);
		

	}

	@Override
	public Usuario findByEmail(String email) {
		Connection conn = JdbcDAOFactory.createConnection();
		Usuario usuario = null;
		try {
			PreparedStatement stmt = conn.prepareStatement("select * from usuarios where email = ?");
			stmt.setString(1, email);
			ResultSet rs = stmt.executeQuery();


			if (rs.next()) {
				// criando o objeto Contato
				usuario = new Usuario();
				usuario.setNome(rs.getString("nome"));
				usuario.setEmail(rs.getString("email"));
				usuario.setTipo(rs.getString("tipo"));
				usuario.setUltimoLogin(rs.getDate("ultimo_login"));
			
			}
			rs.close();
			stmt.close();
			
			
			
		}
		catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		JdbcDAOFactory.releaseConnection(conn);

		return usuario;
	}

	@Override
	public Usuario findById(String id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Usuario[] findAllByEmailOrNomeAndTipo(String search, String tipo) {
		Connection conn = JdbcDAOFactory.createConnection();
		List<Usuario> usuarios = new ArrayList<Usuario>();
		try {
			String sql = (tipo != null && tipo.length() > 0) ? " and tipo = ?" : "";
			PreparedStatement stmt = conn.prepareStatement("select * from usuarios where (nome like ? or email like ?)"+sql);
			stmt.setString(1, "%"+search+"%");
			stmt.setString(2, "%"+search+"%");
			if((tipo != null && tipo.length() > 0))
				stmt.setString(3, tipo);
			ResultSet rs = stmt.executeQuery();


			while (rs.next()) {
				// criando o objeto Contato
				Usuario usuario = new Usuario();
				usuario.setNome(rs.getString("nome"));
				usuario.setEmail(rs.getString("email"));
				usuario.setTipo(rs.getString("tipo"));
				usuario.setUltimoLogin(rs.getDate("ultimo_login"));

				// adicionando o objeto à lista
				usuarios.add(usuario);
			}

			rs.close();
			stmt.close();
		}
		catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		JdbcDAOFactory.releaseConnection(conn);

		return usuarios.toArray(new Usuario[usuarios.size()]);
	}



}
